//
//  LWNetworkTools.swift
//  LW_Weibo
//
//  Created by 刘伟 on 16/7/10.
//  Copyright © 2016年 LWSpro. All rights reserved.
//

import UIKit
import AFNetworking

//枚举
enum RequestType: Int {
    
    case GET
    case POST
    
}

class LWNetworkTools: AFHTTPSessionManager {
    
    //起别名
    typealias CallBack = (response: AnyObject?, error: NSError?) -> ()
    
    //单例模式
    static let sharedTools: LWNetworkTools = {
       
        let manager = LWNetworkTools()
        
        //给对象添加一个"text/plain" 模式
        manager.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        return manager
        
    }()
    
    
    //MARK: - 上传图片的网络工具
    func requestUpload(url: String, params: AnyObject?, imageData: NSData, name: String, callBack: CallBack) {
        
        
        // 上传图片接口
        POST(url, parameters: params, constructingBodyWithBlock: { (formData) -> Void in
            
            /*
            
            imageData: 上传图片所需要二进制数据
            name: 字段名 服务端获取数据的参数
            fileName:  告诉服务端我们的文件名字,服务端一般不会用,他们会自动生成唯一的一个图片名
            
            mimeType: 资源类型, octet-stream通用的资源类型
            
            */
            
            formData.appendPartWithFileData(imageData, name: name, fileName: "test", mimeType: "octet-stream")
            
            
            
            }, progress: nil, success: { (_, response) -> Void in
                
                //把服务器传过来的数据传给外界
                callBack(response: response, error: nil)
                
            }) { (_, error) -> Void in
                
                callBack(response: nil, error: error)
                
                
                
        }
        
        
        
        
        
    }
    
    
    
    
    
    
    
    
    
    
    
    //MARK: - 发送网络请求 判断是GET 还是 POST 发送
    func request(type: RequestType, url: String, params: AnyObject?, callBack: CallBack) {
        
        if type == .GET {
            
            GET(url, parameters: params, progress: nil, success: { (_, response) -> Void in
                
                
                callBack(response: response, error: nil)
                
                
                }, failure: { (_, error) -> Void in
                    
                    
                callBack(response: nil, error: error)
                    
                    
            })
            
            
        }else {
            
            
           POST(url, parameters: params, progress: nil, success: { (_, response) -> Void in
            
            callBack(response: response, error: nil)
            
            
            }, failure: { (_, error) -> Void in
                
                callBack(response: nil, error: error)
                
           })
           
            
            
        }
        
        
        
    }
    


}



//MARK: - 获取access_token 和 用户信息
extension LWNetworkTools {
    
    //这个网络工具方法 是让我们通过授权码发送网络请求 来获取access_token 只有获取了access_token  我们才能登录获取到用户的信息
    func ruquestAccesstoken(code: String, callBack:(response: AnyObject?, error: NSError?) -> ()) {
        
        
        //网址
        let url = "https://api.weibo.com/oauth2/access_token"
        
        //参数 发送网络请求  通过code来获取access_token
        let params = [
        
            "client_id": WeiboAPPKey,
            "client_secret": WeiboAppSecret,
            "grant_type": "authorization_code",
            "code": code,  //我们传进来的授权码
            "redirect_uri": WeiboRedirect_Uri
        
        ]
        
        
        //调用网络发送请求的方法  将网络返回的数据传回去 和OC里面的block 一样  这样我们就获取到了 access_token
        request(.POST, url: url, params: params, callBack: callBack)
        
        
    }
    
    
    
    //获取用户信息 通过传进来的userAccount.access_token 来获取用户的信息 access_token 是通过code获取到的
    
    func requestUserInfo(userAccount: LWUserAccount, callBack:(response: AnyObject?, error: NSError?) -> ()) {
        
        //请求接口
        let url = "https://api.weibo.com/2/users/show.json"
        
        //准备请求参数
        //  int64,跟字符串放在一起编译不通过,需要转换成字符串
        let params = [
        
            "access_token": userAccount.access_token!,
            
            "uid": "\(userAccount.uid)"
        
        ]
        
        
        request(.GET, url: url, params: params, callBack: callBack)
        
        
    }
    
    
    
    
    
    
    
}


//MARK: - 上传图片和发送微博
extension LWNetworkTools {
    
    //CallBack闭包别名
    func upload(access_token: String, status: String, image: UIImage, callBack: CallBack) {
        
        //准备地址
        let url = "https://upload.api.weibo.com/2/statuses/upload.json"
        
        //准备参数
        let params = [
        
            "access_token": access_token,
            "status": status
        
        ]
        
        //这种图片转二进制的图片要比下面一种占内存大 两者显示的效果基本是一样的  看不出来区别 所以最好用下面那种图片转二进制
//        let imageData1 = UIImagePNGRepresentation(image)
        
         // 第二个参数 compressionQuality质量系数  0-1, 系数越小质量越低
        let imageData = UIImageJPEGRepresentation(image, 0.5)!
        
        
        requestUpload(url, params: params, imageData: imageData, name: "pic", callBack: callBack)
        
        
    }
    
    
    
}





// MARK:    - 发送微博相关接口
extension LWNetworkTools {
    /**
     发送文字微博接口
     
     - parameter access_token: 访问令牌
     - parameter status:       微博内容
     - parameter callBack:     数据回调
     */
    func update(access_token: String, status: String, callBack: CallBack) {
        //  准备接口地址
        let url = "https://api.weibo.com/2/statuses/update.json"
        //  准备参数
        let params = [
            "access_token": access_token,
            "status": status
        ]
        //  使用共有函数进行网络请求数据
        request(.POST, url: url, params: params, callBack: callBack)
        
    }
    
}










//MARK: - 微博首页相关接口
extension LWNetworkTools {
    
    
    
    //获取微博数据  网络请求  需要将响应的数据传回去
    
    //maxId 对应着上拉加载更多   sinceId 对应着下拉刷新  设置两个默认值,那么外面调用的时候可以不传值  也可以传值 如果传值就是传的值，不传就是默认的值
    func loadStatus(maxId: Int64 = 0, sinceId: Int64 = 0,returnBack: CallBack) {
        
        //准备接口地址 可以进入微博文档查看  而且请求方式是get
        let url = "https://api.weibo.com/2/statuses/friends_timeline.json"
        
        //准备参数
        let params = [
        
        "access_token": LWUserAccountViewModel.sharedUserAccount.access_token!,
           
            "max_id": "\(maxId)",
            
            "since_id": "\(sinceId)"
        
        ]
        

        
        //打印地址 是为了获取服务器返回的JSON  将打印的网址输入到浏览器即可
//        print(url + "?access_token=" + LWUserAccountViewModel.sharedUserAccount.access_token!)
        
        //发送请求
        request(.GET, url: url, params: params, callBack: returnBack)

    }
    
    
    
    
    
    
    
}


















